#include <iostream>
#include <time.h>
#include <stdlib.h>
#include <math.h>


#include "Kurcaci.h"
#include "Aqua.h"
#include "Bolt.h"
#include "Clash.h"
#include "Lahan.h"
#include "player.h"
#include "classinventory.h"
/*
 * bentuk Map:
 *  0 1 2 3 4 5 6 7 8
 * 0
 * 1
 * 2
 * 3
 * 4
 * 5
 * 6
 * 7
 * 8
 * 
 * 
 * kurcaci dapat "melihat" tanaman dalam area sebesar 3x3, dengan kurcaci berada di petak tengah.
 * */
using namespace std;

void Kurcaci::ChaseTarget()
{
        int Fx, Fy; //posisi kurcaci, disimpan di sini.
        Position DummyChase;
        Fx = GetX();
        Fy = GetY();
        DummyChase = GetChase();
	
	if ( ((Fx == DummyChase.x) && (abs(Fy - DummyChase.y) == 1)) || ((Fy == DummyChase.y) && (abs(Fx - DummyChase.x) == 1)))
            //Kalau posisi kurcaci saat ini TEPAT di sebelah tanaman
	{
		
		  ActKurcaci();
	}
	else //Kalau posisi kurcaci saat ini berada di diagonal dari tanaman
	{
                //int stat1 = L.getStatus(Chase.x,(Chase.y)+1);
                //int stat2 = L.getStatus(Chase.x,(Chase.y)-1);
               // int stat3 = L.getStatus((Chase.x)+1,Chase.y);
               // int stat4 = L.getStatus((Chase.x)-1,Chase.y);
		if (( IsSafeToWalk(DummyChase.x,(DummyChase.y)+1) &&(Fy == (DummyChase.y)+1))  // kalau posisi vertikal (y) kurcaci ada dibawah tanaman
                    ||
                    ( IsSafeToWalk(DummyChase.x,(DummyChase.y)-1) && (Fy == (DummyChase.y)-1)))  // kalau posisi vertikal (y) kurcaci ada diatas tanaman
		{
			   SetX(DummyChase.x);
                }
		else if (( IsSafeToWalk((DummyChase.x)+1,DummyChase.y) &&(Fx == (DummyChase.x)+1)) // kalau posisi horisontal (x) kurcaci ada dikanan tanaman
			  ||
                        (IsSafeToWalk((DummyChase.x)-1,DummyChase.y) && (Fx == (DummyChase.x)-1)))// kalau posisi vertikal (x) kurcaci ada dikiri tanaman
		{
			    SetY(DummyChase.y);
		}
                else
                {SetTarget(0);} //belum fix. paling gak ini script sementara, kalau kurcaci tak mampu kesana, ya dia menyerah.
	}
}

int Kurcaci::GenRandom()
{
	int a;
	//srand ( time(NULL) );
    /* generate random number: */
	a = (rand() % 4) + 1; //batas atasnya 4, batas bawahnya 1
	return a;
}

void Kurcaci::Sleep()
{
	Status = 0;
}

void Kurcaci::WakeUp()
{
	Status = 1;
}

boolean Kurcaci::IsWakeUp() const
{
    if (Status == 1)
	{return true;}
	else
	{return false;}
}

boolean Kurcaci::IsTargetting() const
{
	return AnyTarget;
}
void Kurcaci::SetTarget(int Ta)
{
    if (Ta == 1)
	AnyTarget = true;
    else
        AnyTarget = false;
}
void Kurcaci::SetChase(int Tx, int Ty)
{
	Chase.x = Tx;
	Chase.y = Ty;
}
void Kurcaci::SetX(int Newx)
{
    PosKurcaci.x = Newx;
}
void Kurcaci::SetY(int Newy)
{
    PosKurcaci.y = Newy;
}
int Kurcaci::GetX() const
{
   return PosKurcaci.x;
}
int Kurcaci::GetY() const
{
   return PosKurcaci.y;
}
Position Kurcaci::GetChase() const
{
    return Chase;
}
void Kurcaci::PrintStatus()
{
    switch(Status)
    {
        case 0 : cout << "Sleep" << endl;
                 break;
        case 1 : cout << "Wake Up" << endl;
                 break;
    }
}
int Kurcaci::GetStatus()
{
    return Status;
}

void Kurcaci::Move()
{
	//Tahap pertama dari method move adalah mengambil satu arah random dan memeriksanya.
	int RandomInt; //nilai dari random integer
	int Aman; //bernilai 0 untuk penahan, bernilai 1 supaya kurcaci dapat mengeksekusi gerakannya.
	int i,j; // iterator
        int Fx, Fy; //posisi kurcaci, disimpan di sini.

        Fx = GetX();
        Fy = GetY();

	Aman = 0;

        if (IsTargetting())
            {ChaseTarget();}
	else
	{
            RandomInt = GenRandom();
              /*
                    dengan asumsi:
                    1 = utara
                    2 = timur
                    3 = selatan
                    4 = barat
              */
            do{
                    //Proses ini akan mengakses method dari map, yang menunjukkan posisi ujung dari map.
                    switch (RandomInt) {
                    case 1 :
                                    if ( (Fy - 1) >= 0 /*batas atas Map*/ )
                                    {
                                        if(IsSafeToWalk(Fx, (Fy - 1) ) == false) /* Pengecekan apakah posisi tersebut aman untuk dimasuki. sengaja tidak di && dengan pengecekan diatas, untuk mencegah terjadinya error */
                                        {
                                          RandomInt = GenRandom();
                                          Aman = 0;
                                        }
                                        else
                                            Aman = 1;
                                    }
                                    else
                                            { RandomInt = GenRandom(); Aman = 0; }
                                    break;

                    case 2 :
                                    if ( (Fx + 1) <=  8   /*batas kanan Map*/ )
                                    {
                                        if(IsSafeToWalk((Fx + 1), Fy ) == false)
                                         {
                                          RandomInt = GenRandom();
                                          Aman = 0;
                                        }
                                        else
                                            Aman = 1;
                                    }
                                     else
                                            { RandomInt = GenRandom(); Aman = 0; }
                                    break;

                    case 3 :
                                    if ( (Fy + 1) <= 8 /*batas bawah Map*/ )
                                    {
                                        if (IsSafeToWalk(Fx, (Fy + 1) ) == false)
                                        {
                                          RandomInt = GenRandom();
                                          Aman = 0;
                                        }
                                        else
                                            Aman = 1;
                                    }
                                      else
                                            {RandomInt = GenRandom(); Aman = 0;}
                                    break;

                    case 4 :
                                    if ( (Fx - 1) >= 0 /*batas kiri Map*/ )
                                    {
                                        if(IsSafeToWalk((Fx - 1), Fy ) == false)
                                        {
                                          RandomInt = GenRandom();
                                          Aman = 0;
                                        }
                                        else
                                            Aman = 1;
                                    }
                                    else { RandomInt = GenRandom(); Aman = 0; }
                                    break;
                            }
              }
              while (Aman == 0);

              //proses dibawah dieksekusi bila  Aman = 1

              switch (RandomInt)
              {
                    case 1 : {
                                    SetY(Fy - 1);
                                    break;
                            }

                    case 2 : {
                                    SetX(Fx + 1);
                                    break;
                            }
                    case 3 : {
                                    SetY(Fy + 1);
                                    break;
                            }
                    case 4 : {
                                    SetX(Fx - 1);
                                    break;
                            }
              }
                    //proses dibawah digunakan untuk meng-scan-tanaman

              HomingTanaman(); // didefinisikan di kelas anak
        }
}
